import LinkedList from './01_实现单向链表LinkedList'
import { DoublyNode, Node } from './LinkedNode';

class DoublyLinkedList<T> extends LinkedList<T>{
    protected head: DoublyNode<T> | null = null
    protected tail: DoublyNode<T> | null = null

    append(value: T): void {
        const newNode = new DoublyNode<T>(value)
        // 如果当前的链表没有数据
        if(!this.head){
            this.head = newNode;
            this.tail = newNode;
        }else{
            this.tail!.next = newNode;
            // 不能将一个父类的对象,赋值给一个子类的类型
            // 可以将一个子类的类型, 赋值给一个父类的类型(多态)
            newNode.prev = this.tail;
            this.tail = newNode;
        }
        this.length++;
    }

    // 新增的prepend方法
    prepend(value:T){
        const newNode = new DoublyNode<T>(value)
        // 如果当前的链表没有数据
        if(!this.head){
            this.head = newNode;
            this.tail = newNode;
        }else{
            //新节点的下一个节点为之前的头结点
            newNode.next = this.head;
            // 之前头结点的上一个节点为新节点（新头节点）
            this.head.prev = newNode;
            // 让this.head新添加的节点
            this.head = newNode;
        }
        this.length++;
    }

    // 反向遍历链表
    postTraverse(){
        let current = this.tail;
        let values: T[] = [];
        while(current){
            values.push(current.value)
            current = current.prev;
        }
        console.log(values.join('->'));
    }
}

const dLinkedList = new DoublyLinkedList<string>()

// 测试append方法

console.log('------------append/prepend-------------')
dLinkedList.append('aaa')
dLinkedList.append('bbb')
dLinkedList.append('ccc')
dLinkedList.append('ddd')

dLinkedList.prepend('abc')
dLinkedList.prepend('cba')


dLinkedList.traverse()
dLinkedList.postTraverse()
